您好,欢迎来到达州工业云! 平台首页 企业驾驶舱 帮助中心 企业登录 企业注册

HI,欢迎使用达州工业云平台!

账号必须大于2位

创新资源平台
服务平台首页>专利库>专利详情

提高AUTOSAR OS MCAL驱动代码可移植性的方法

  • 申请号:CN201210065046.2 申请公布号: CN102681898B
  • 申请日: 2012-03-13 申请公布日: 2014-07-09
  • 申请(专利权)人: 专利代理机构: 杭州裕阳专利事务所(普通合伙)
  • 分类号:G06F9/48

专利介绍

本发明公开了提高AUTOSAR OS MCAL驱动代码可移植性的方法,将AUTOSAR OS MCAL驱动代码结构分成Module.c和Module_Hw.c两层;Module.c实现符合AUTOSAR标准规定的Module_Function函数;Module_Hw.c实现被Module.c调用的特定接口函数;将驱动代码应用于ECU硬件中,判断ECU硬件是否支持该驱动代码所实现的功能,如果支持该功能,则设置寄存器的值或读取寄存器的值,并对寄存器的上述操作进行封装,具有对驱动代码与硬件相关的部分进行抽象,使代码清晰度更高,增强了驱动代码的可移植性,减少移植工作量,缩短开发周期等优势。
1.提高AUTOSARxa0OSxa0MCAL驱动代码可移植性的方法,其特征在于,包括如下步骤:1)将AUTOSARxa0OSxa0MCAL驱动代码结构分成Module.c和Module_Hw.c两层;所述Module.c实现符合AUTOSAR标准规定的Module_Function函数,其内部进行符合AUTOSAR标准规定的错误检查以及一些全局变量的维护,并负责调用Module_Hw.c代码层;所述Module_Hw.c实现被Module.c调用的特定接口函数,Module_Hw.c主要负责针对具体硬件平台的MCAL模块实现,对状态寄存器进行设置或读取,以及对具体硬件寄存器进行设置或读取;2)将所述驱动代码应用于ECU硬件中,判断所述ECU硬件是否支持该驱动代码所实现的功能,如果支持该功能,则设置寄存器的值或读取寄存器的值,并对寄存器的操作进行封装,寄存器的操作包括设置寄存器的值或读取寄存器的值。
2.根据权利要求1所述的提高AUTOSARxa0OSxa0MCAL驱动代码可移植性的方法,其特征在于,用与寄存器关联的宏来定义寄存器的地址值。
3.根据权利要求1所述的提高AUTOSARxa0OSxa0MCAL驱动代码可移植性的方法,其特征在于,寄存器的地址值可以按照ECU硬件中定义的地址结构依次定义。
4.xa0根据权利要求1所述的提高AUTOSARxa0OSxa0MCAL驱动代码可移植性的方法,其特征在于,对寄存器的操作可以封装成宏定义。技术领域
本发明涉及嵌入式实时操作系统对多平台的适应性,是一种提高AUTOSARxa0OSxa0MCAL驱动代码的可移植性的技术方法。
背景技术
AUTOSAR(AUTomotivexa0Openxa0Systemxa0Architecture)是一个标准化的开放式汽车软件架构。AUTOSARxa0OS是符合AUTOSAR标准的嵌入式实时操作系统,是一个静态配置的多任务单处理器的RTOS。本发明所参照的AUTOSAR标准为3.0.1版本,并且实现在由浙江大学自主研发的符合AUTOSAR标准的OS——SmartOSEKxa0OS上。移植驱动代码是移植AUTOSAR所必须的工作,其工作量很大,且在不同硬件平台上很多工作都是重复的。MCAL驱动代码是与电控单元是电子控制单元(ECU)硬件相关的,AUTOSAR中规定的标准函数接口功能上是确定的,传统的MCAL驱动通常将所有代码放在一个文件中实现,代码可重用性极弱,不同ECU硬件下驱动模块的移植过程复杂,工作量大。但是这些函数的功能未必是完全ECU相关的,整个函数功能完成过程中可能只有部分代码需要访问寄存器,在现在的MCAL驱动代码中,还存在如下问题:由于驱动代码通常作为一个整体实现,代码的可重用性弱,可移植性差,不同ECU硬件下驱动模块的移植过程复杂,工作量大,模块开发周期长。
发明内容
针对上述技术问题,本发明借鉴AUTOSAR的分层架构可以对驱动代码进一步抽象,提出提高AUTOSARxa0OSxa0MCAL驱动代码的可移植性的技术方法,将硬件相关的代码用函数来实现,其他软件控制的流程对不同的ECU来说是可以重用的,将驱动代码进一步抽象,增强其硬件多平台的适应性,大大缩短模块的开发周期。为了解决上述技术问题,本发明的技术方案如下:提高AUTOSARxa0OSxa0MCAL驱动代码可移植性的方法,包括如下步骤:1)将AUTOSARxa0OSxa0MCAL驱动代码结构分成Module.c和Module_Hw.c两层;所述Module.c实现符合AUTOSAR标准规定的Module_Function函数,其内部进行符合AUTOSAR标准规定的错误检查以及一些全局变量的维护,并负责调用Module_Hw.c代码层;所述Module_Hw.c实现被Module.c调用的特定接口函数,该层主要负责针对具体硬件平台的MCAL模块实现,对状态寄存器进行设置或读取,以及对具体硬件寄存器进行设置或读取;2)将所述驱动代码应用于ECU硬件中,判断所述ECU硬件是否支持该驱动代码所实现的功能,如果支持该功能,则设置寄存器的值或读取寄存器的值,并对寄存器的上述操作进行封装。进一步的,用与寄存器关联的宏来定义寄存器的地址值。进一步的,寄存器的地址值可以按照ECU硬件中定义的地址结构依次定义。进一步的,用与功能相关的宏定义来指定寄存器需要设置的工作模式的数值,其位数可以设置为寄存器位数相同,然后通过掩码来获取所需部分,也可以设置为寄存器中控制模式的位数相等。进一步的,对寄存器的操作可以封装成宏定义。本发明的有益的效果为:1.对驱动代码与硬件相关的部分进行抽象,使代码清晰度更高2.通过对驱动代码抽象,可根据ECU硬件是否支持该功能来决定是否实现。3.增强了驱动代码的可移植性,减少移植工作量,缩短开发周期。4.通过对寄存器操作进行封装,保持了可扩展性,方便错误检查。
附图说明
图1是应用本发明的驱动代码文件结构;图2是以ICU模块为例,引入本发明前AUTOSAR标准的文件结构图;图3是以ICU模块为例,引入本发明后的文件结构图;图4是以ICU模块为例,Icu_Init函数的流程图。
具体实施方式
下面将结合附图和具体实施例对本发明做进一步的说明。传统AUTOSARxa0OSxa0MCAL驱动通常将所有代码都放在一个文件中实现,符合AUTOSAR标准规定的接口函数命名为Module_Function。将原来的AUTOSARxa0OSxa0MCAL驱动代码结构分成Module.c和Module_Hw.c两层。Module.c主要负责实现与AUTOSAR标准接口相关,Module_Hw.c主要负责实现与具体硬件平台相关。(1)、Module.c文件实现符合AUTOSAR标准规定的Module_Function函数,其内部进行标准规定的错误检查以及一些全局变量的维护,并负责调用Module_Hw.c代码层。(2)、Module_Hw.c文件实现被Module.c调用的特定接口函数,该层主要负责针对具体硬件平台的MCAL模块实现,对状态寄存器进行设置或读取,以及对具体硬件寄存器进行设置或读取。在Module.c和Module_Hw.c的实现中,有一些过程控制是可重用的,本发明规定过程中特定的可重用部分,进一步减小MCAL驱动代码移植的工作量,缩短开发周期。对驱动代码抽象以后,驱动程序只需要根据ECU硬件是否支持该功能来决定是否实现即可,如果ECU硬件支持,则只需要修改与硬件相关的部分代码,主要操作有设置寄存器的值或读取寄存器的值。寄存器封装寄存器操作因为都是与硬件寄存器相关,因此可以直接对硬件地址进行操作,但是为了尽可能的保持可扩展性、方便查错修改,因此对寄存器的操作进行封装。寄存器的地址用与寄存器关联的宏来定义,这样对寄存器操作时候用宏定义可以方便看到具体是对什么寄存器进行的操作。寄存器的地址可以按照ECU硬件中定义的地址结构依次定义,便于检查定义是否出错。寄存器需要设置的工作模式,用与功能相关的宏定义来指定其数值,其位数可以设置为寄存器位数相同,然后通过掩码来获取所需部分,也可以设置为寄存器中控制模式的位数相等。对寄存器的操作也可以封装成宏定义,比如读取N位数值,写N位数值到某个寄存器等。举例说明32位读写宏定义如下所示。#definexa0REG_WRITE32(address,value)xa0xa0(*(uint32*)(address)=(value))#definexa0REG_READ32(address)xa0xa0xa0xa0xa0xa0xa0xa0xa0xa0(*(volatilexa0uint32*)(address))下面以TC1767平台上的ICU为例,结合附图和实施例对本发明作进一步说明:本发明在浙大自主研发的符合AUTOSAR标准的RTOS——SmartOSEKxa0OS上得到了实现。SmartOSEKxa0OS和SmartSAR软件平台的其他模块紧密相连,引入本发明之前,AUTOSAR标准中ICU模块的文件结构如图2所示,引入本发明之后,ICU模块的文件结构如图3所示。文件主要包括两部分:代码文件和头文件。文件结构如下图1所示。图所示的文件中,Module可以具体替换为各驱动模块,比如Adc、Pwm等。其中Module_PBCfg.c、Module_Irq.c和Dem.h是可能包含的,比如Module_Irq.c是有在对应的驱动程序需要中断来处理时才会包含;Dem.h只有驱动代码中包含生产错误是才需要。Module_Hw.c和Module_Hw.h文件是AUTOSAR规定之外的文件,是为了代码的抽象而提出来的,Module_Hw.c中包含的是寄存器相关的操作。其中通过Dem.h中引入了类型Dem_EventIdType,用来表示生产错误的数字标识;Std_Types.h中引入了类型Std_RetumType和Std_VersionInfoType,Std_RetumType用来表示返回程序运行结果是成功还是失败,Std_VersionInfoType用来表示版本信息。在引入本发明到SmartOSEK之后,定义的数据结构如下:表1.IcuConfigSet结构属性ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>表2IcuGeneral属性ntent="drawing" img-format="tif" inline="no" orientation="portrait" wi="700"/>表1所列的为TC1767平台下,ICU模块的IcuConfigSet结构属性,以及各个属性的描述;表2列出了IcuGeneral结构的属性,其中IcuOptionalApis属性中包括所有AUTOSAR标准规定的可选ICU服务API,在表中省略。以Icu_Init函数为例,其流程图如图4所示。Icu_Init的具体实施步骤如下:(1)根据表1,配置IcuConfigSet结构的各项属性(2)调用Icu_Init(),在Icu_Init中进行[ICU002]、[ICU111]、[ICU023]、[ICU048]各项错误检查。(3)保存ConfigPtr指针,调用Icu_Hw_Init()。(4)在Icu_Hw_Init()中初始化Channel、MaxChannels、DutyIndex、TimestampIndex、EdgeCountIndex、GptaModule、Icu_GlobalIndexStatus等变量,并初始化相应的硬件寄存器。(5)退出Icu_Hw_Init()函数,将Icu_Current_Mode设成ICU_MODE_NOMAL。以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员,在不脱离本发明构思的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明保护范围内。